# 多态：顾名思义就是多种状态、形态，就是同一种方法对于不同的子类对象有不同的方法表现，不同的子类调用相同的方法产生了不同的结果，简单来说，多态意味着“同一接口，多种实现”。
# 实现多态的前提：
# 1、继承：多态必须发生在父类和子类之间
# 2、重写：子类重写父类的方法
class Animal:#(父类)
    '''
    父类(基类)
    '''
    def say_who(self):
        print('我是一个动物...')
        pass
    pass
class Duck(Animal):
    '''
    鸭子类 子类(派生类)
    '''
    def say_who(self):
        '''
        重写父类的方法
        :return:
        '''
        print('我是一只漂亮的鸭子')
        pass
    pass
class Dog(Animal):
    '''
    小狗类 子类(派生类)
    '''
    def say_who(self):
        '''
        重写父类的方法
        :return:
        '''
        print('我是一只哈巴狗')
        pass
    pass
class People:#(父类)
    def say_who(self):
        print('我是人类')
        pass
class Student(People):
    def say_who(self):
        print('我是一年级的学生 张明')
        pass
    pass
def commonInvoke(obj):
    '''
    统一调用的方法
    :param obj: 对象的实例
    :return:
    '''
    obj.say_who()
duck1=Duck()
duck1.say_who()
dog1=Dog()
dog1.say_who()
listObj=[Duck(),Dog(),Student()]
for item in listObj:
    '''
    循环调用函数
    '''
    commonInvoke(item)
    pass
# 不同父类但拥有相同方法都能调用
# 鸭子类型是动态类型的一种风格，不依赖继承，只要对象具有所需方法即可。在这种风格中，一个对象有效的语义，不是由继承自特定的类或实现特定的接口，而是由当前的方法和属性的集合决定。
# 在鸭子类型中，关注的不是对象的类型本身，而是它是如何使用的
# 多态的用途：
# 增加程序的灵活性
# 增加程序的扩展性

# 抽象类(接口)
# 抽象类：用于定义不被直接实例化的类，其主要目的是作为其他类的父类（基类），强制子类实现特定的方法，由子类创建的实例对象完成具体的工作，含有抽象方法的类称之为抽象类
# 抽象方法：只有方法定义，没有具体实现，方法体是空操作语句占位的(pass)称之为抽象方法
class AC:
    def cool_wind(self):
        """制冷"""
        pass
    def hot_wind(self):
        """制热"""
        pass
    def swing_l_r(self):
        """左右摆风"""
        pass
class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")
    def hot_wind(self):
        print("美的空调制热")
    def swing_l_r(self):
        print("美的空调左右摆风")
class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")
    def hot_wind(self):
        print("格力空调制热")
    def swing_l_r(self):
        print("格力空调左右摆风")
def make_cool(ac: AC):
    ac.cool_wind()
midea_ac = Midea_AC()
gree_ac = GREE_AC()
make_cool(midea_ac)
make_cool(gree_ac)
# 定义函数(方法)，通过类型注解声明需要父类实例对象，实际传入子类实例对象进行工作，从而获得不同的工作状态